#ifndef TASKINFO_H
#define TASKINFO_H


#include <deque>

#include "core.h"
#include "system.h"
#include "proc.h"

/*任务状态*/
enum class TaskState
{
    UNSUPPORT = -1, // 不支持的状态

    R = 1,  // 执行
    S,      // 睡眠
    D,      // 不可被中断的睡眠
    Z,      // 僵死
    T,      // traced or stopped
};

namespace StateMeaning
{

/*返回一个用于解释进程状态含义的字符串*/
std::string meaning(TaskState state);
}

enum class SortBy
{
    PID,
    PPID,
    NAME,
    USERNAME,
    STATE,

    VM_SIZE,
    VM_RESIDENT,
    VM_SHARED,
    VM_PRIVATE,

    CPU_USAGE,
    CPU_TIME,

    START_TIME,
    NICE,
    CMD,
};


/**
 * @brief The TaskInfo struct 保存经过处理筛选的某些任务信息
 *
 * 这个结构体仅保存数据，并不由自己的成员函数获取数据。
 * 因为这个结构体中会保存一些和时间差相关的数据，不能在一个时刻获得，
 * 需要由一个线程来设置。
 */
struct TaskInfo
{
public:

    TaskInfo() {}

    TaskInfo(pid_t pid);

    pid_t getPid() const { return pid; }

    pid_t getPPid() const { return ppid; }

    pid_t getOldPPid() const { return old_ppid; }

    bool isRoot() const { return ppid == 0; }

    bool hasParent() const { return ppid > 0; }

    std::string getName() const { return name; }

    uid_t getUid() const { return uid; }

    std::string getUserName() const { return SYS.getUserName(uid); }

    TaskState getState() const { return state; }

    uintptr_t getVmSize() const { return vm_size; }

    uintptr_t getVmResident() const { return vm_resident; }

    uintptr_t getVmShared() const { return vm_shared; }

    uintptr_t getVmPrivate() const { return vm_private; }

    double getCpuUsage() const { return cpu_usage; }

    jiffies_t getCpuTime() const { return cpu_time; }

    time_t getStartTime() const { return start_time; }

    int getNice() const { return nice; }

    std::string getCmd() const { return cmd; }


    void flush();


private:

    pid_t           pid;            // 进程ID
    pid_t           ppid;           // 父进程ID
    pid_t           old_ppid;       // 刷新前的父进程ID，用于判断这个进程是否在进程树中移动
    std::string     name;           // 进程名
    uid_t           uid;            // 用户ID
    TaskState       state;          // 进程运行状态


    uintptr_t       vm_size;        // 虚拟内存
    uintptr_t       vm_resident;    // 驻留内存 (驻留内存 = 独占内存 + 共享内存)
    uintptr_t       vm_shared;      // 共享内存
    uintptr_t       vm_private;     // 独占内存



    double          cpu_usage;      // CPU使用率
    jiffies_t       cpu_time;       // CPU使用时间


    time_t          start_time;     // 程序启动时间(人类自然时间)
    int             nice;           // nice
    std::string     cmd;            // 命令行

private:
    /* 以下字段保存用于辅助计算的信息 */

    jiffies_t jiffies;
    jiffies_t utime;
    jiffies_t stime;
    jiffies_t cutime;
    jiffies_t cstime;

    void loadFromSys();

    void loadFromTaskFileContent(const TaskFileContent &t);

};

enum class TIP // TaskInfo Prop
{
    UNSUPPORT,

    PID,
    PPID,
    NAME,
    USERNAME,
    STATE,

    VM_SIZE,
    VM_RESIDENT,
    VM_SHARED,
    VM_PRIVATE,

    CPU_USAGE,
    CPU_TIME,

    START_TIME,
    NICE,
    CMD,

};


namespace TIPUtils // TIP Utils
{

int getPropCount();

TIP getPropAt(int index);

int getPropIndex(TIP prop);

SortBy propToSortBy(TIP prop);

SortBy columnToSortBy(int column);

}



#endif // TASKINFO_H

